<?php

/*
 * Model Login
 * -------------------------------------------------------------
 * File:        login_md.class.php
 * Type:        class
 * Name:        Login_md
 * Description: Sera responsavel pela validacao e criacao de Sessoes 
 * do usuario
 * -------------------------------------------------------------
 * @license GNU Public License (GPL)
 * #author Adelson Murakami dos Santos
 * -------------------------------------------------------------
 * -------------------------------------------------------------
 */
class Login_md {

    private $user; //login ou email do usuario
    private $pass; // senha do usuario
    protected $db; // propriedade que sera instaciada para receber o obj PDO


    /* tabela do usuario no banco de dados
     * @var string
     */
    public $tabelausuario = "cms_usuarios";

    /* INICIA A SESSAO CASO NECESSARIO
     * @var boolean
     */
    public $iniciaSessao = false;

    /* COOKIE PARA SEGURANCA
     * @VAR STRING
     */
    public $cookie = true;

    /* metodo setter e getter */

    public function getUser() {
        return $this->user;
    }

    public function getPass() {
        return $this->pass;
    }

    public function setUser($user) {
        $this->user = $user;
    }

    public function setPass($pass) {
        $this->pass = $pass;
    }

    /* METODO CONSTRUTOR */

    public function __construct() {
        $this->db = new Dbconnection();
    }

    /* CODIFICA A SENHA
     * @PARA STRING $senha 
     * RETURN STRING SENHA CODIFICADA
     */

    protected function codificaSenha($senha) {
        return md5($this->getPass());
    }

    /* METODO QUE FAZ A VALIDACAO DO USUARIO 
     * RETURN  JSON STRING
     */

    protected function validaUser() {
        try {
            $regex = "/^([a-zA-Z0-9]+.?(\.com\.br|\.net|\.com))|(^[a-z0-9_\.\-]+@[a-z0-9_\.\-]*[a-z0-9]+\.[a-z]{2,4})$/i";
            $user = trim($this->getUser());
            $pass = $this->codificaSenha(trim($this->getPass()));

            if (empty($user) && empty($pass)) {
                throw new Exception("Todos os campos sao obrigatorio", 0);
            } else if (!preg_match($regex, $user)) {
                throw new Exception("Digite um email valido", 0);
            } else {
                $consultaLogin = $this->db->select($this->tabelausuario, "*", " email='{$user}' AND senha='{$pass}' LIMIT 1", TRUE);
                if (count($consultaLogin) <= 0) {
                    throw new Exception("Usuario inexistente", 0);
                } else if (!$consultaLogin[0]->status) {
                    throw new Exception("Sua conta esta suspensa temporariamente...", 0);
                } else {
                    return json_encode(array("status" => true, "msg" => "Logado com sucesso"));
                }
            }
        } catch (Exception $ex) {
            return json_encode(array("status" => false, "msg" => $ex->getMessage()));
        }
    }

    /* METODO QUE FAZ LOGA O USUARIO NO SISTEMA
     * CRIANDO AS SESSOES
     * RETURN STRING JSON
     */

    public function logarUser() {
        try {
            $validaUser = json_decode($this->validaUser());
            if (!$validaUser->status) {
                throw new Exception($validaUser->msg);
            } else {
                if (empty(session_id())) {
                    session_start();
                }
                $user = trim($this->getUser());
                $pass = $this->codificaSenha(trim($this->getPass()));
                $dadosUser = $this->db->select($this->tabelausuario, "*", "email='{$user}' AND senha='{$pass}' limit 1", true);
                foreach ($dadosUser as $v) {
                    $_SESSION[PREFIXSESSION . 'id_user'] = $v->id;
                    $_SESSION[PREFIXSESSION . 'nome'] = $v->nome;
                    $_SESSION[PREFIXSESSION . 'sobrenome'] = $v->sobrenome;
                    $_SESSION[PREFIXSESSION . 'email']  = $v->email;
                    $_SESSION[PREFIXSESSION . 'login']  = $v->login;
                    $_SESSION[PREFIXSESSION . 'status'] = $v->status;
                    $_SESSION[PREFIXSESSION . 'nivel']  = $v->acesso;
                    $_SESSION[PREFIXSESSION . 'imagem'] = $v->imagem;
                }
                unset($_SESSION[PREFIXSESSION . 'logado']);
                $this->iniciaSessao = true;
                $_SESSION[PREFIXSESSION . 'logado'] = $this->iniciaSessao;
                /* Cria o cookie para maior seguranca com o login, ip e navegador */
                if ($this->cookie) {
                    //conteudo do cookie
                    $contentCookie = join("#", array($_SESSION[PREFIXSESSION . 'login'], $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']));
                    //encriptografa o conteudo
                    $vlCookie = md5($contentCookie);
                    //
                    setcookie("usuario_token", $vlCookie, 0, "/");
                }
                return json_encode(array("status" => true, "msg" => "logado com sucesso"));
            }
        } catch (Exception $ex) {
            return json_encode(array("status" => false, "msg" => $ex->getMessage()));
        }
    }

    /* METODO QUE DESLOGA O USUARIO NO SISTEMA,
     * DESTRUINDO AS SESSOES
     * RETURN STRING JSON
     */
    public function deslogar($id_user) {
        try {
            if ($_SESSION[PREFIXSESSION . "logado"]) {
                setcookie('usuario_token', '', time() - 3600);
                foreach (array_keys($_SESSION) as $v) {
                    unset($_SESSION[$v]);
                }
                if (!isset($_SESSION[PREFIXSESSION . "logado"])) {
                    session_destroy();
                    return json_encode(array("status" => true, "msg" => "Sessao encerrado com sucesso"));
                }
            } else {
                throw new Exception("O ocorreu um erro inesperado!!");
            }
        } catch (Exception $ex) {
            return json_encode(array("status" => false, "msg" => $ex->getMessage()));
        }
    }
    
    /* METODO ESQUECI SENHA
     * ALTERA O CAMPO SENHA DA TABELA ADICIONANDO UMA NOVA SENHA ALEATORIA
     * E RETORNANDO A MESMA PARA QUE POSSA SER ENVIADA PARA O EMAIL DO USUARIO
     * @PARAM INT $TAMANHO
     * @PARAM BOOL $MAIUSCULA 
     * @PARAM BOOL $NUMEROS
     * @PARAM BOOL $SIMBOL 
     * @RETURN STRING JSON
     */
    public function forgotpass($tamanho=32, $maiuscula=false, $numeros=false, $simbols=false){
        $letrasMin  = "abcdefghijklmnopqrstuvxywz";
        $letrasMai  = strtoupper($letrasMin);
        $numeral    = '1234567890';
        $simbolos   = "!@#$%&";
        
        $random_pass = null;
        $caracteres = null;
        
        /*agrupa todos os caracteres que poderao ser utillizados*/
        $caracteres .= $letrasMin;
        if($maiuscula)$caracteres.= $letrasMai;
        if($numeros)$caracteres  .= $numeral;
        if($simbols)$caracteres .= $simbolos;
        
        //total de caracteres possivel
        $totalCaracteres = strlen($caracteres);
        for($i=0; $i<$tamanho; $i++){
            //cria uma string aleatoria de acordo com os parametros ecolhidos
            $rand  = mt_rand(1, $totalCaracteres);
            //concatena uns dos caracteres na variavel de saida
            $random_pass .= $caracteres[$rand-1];
        }
        
        //faz a atualizacao no banco de dados
        try{
            $user = $this->getUser();
            if(!empty($user)){
                //seleciona o registro dele no banco de dados - e10adc3949ba59abbe56e057f20f883e
                //d41d8cd98f00b204e9800998ecf8427e
                $usuario = $this->db->select($this->tabelausuario, "id", "email='{$user}' AND status=1 LIMIT 1",TRUE);
                //se nao existir o usuario
                if(count($usuario)<=0){ throw new Exception("Usuario inexistente"); }
                //atualiza a senha antiga para a nova gerada aleatoriamente
                $this->db->update($this->tabelausuario, array("senha"=>md5(trim($random_pass))), "id={$usuario[0]->id}" );
                return json_encode(array("status"=>true,"password"=>$random_pass,"msg"=>"Uma nova senha foi gerada para sua maior seguranca, entre com esta nova senha depois altere em seu perfil"));
            }
        } catch (Exception $ex) {
            return json_encode(array("status" => false, "msg" => $ex->getMessage()));
        }
    }
    
}
